using Mbl.ParameterizedTest.FluentCollectionBuilding.Expectors;

namespace Mbl.ParameterizedTest.FluentCollectionBuilding.RowCollectors
{
    public class GeneralTestRowCollector<TIn1, TOut> : TestRowCollector<TIn1, TOut>
    {
        public GeneralTestRowCollector(TestCollection<TIn1, TOut> testCollection)
            : base(testCollection)
        {
        }

        public GeneralExpector<TIn1, TOut, GeneralTestRowCollector<TIn1, TOut>> Given(TIn1 in1)
        {
            return new GeneralExpector<TIn1, TOut, GeneralTestRowCollector<TIn1, TOut>>(this, CreateTestCase(in1));
        }
    }

    public class GeneralTestRowCollector<TIn1, TIn2, TOut> : TestRowCollector<TIn1, TIn2, TOut>
    {
        public GeneralTestRowCollector(TestCollection<TIn1, TIn2, TOut> testCollection)
            : base(testCollection)
        {
        }

        public GeneralExpector<TIn1, TIn2, TOut, GeneralTestRowCollector<TIn1, TIn2, TOut>> Given(TIn1 in1, TIn2 in2)
        {
            return new GeneralExpector<TIn1, TIn2, TOut, GeneralTestRowCollector<TIn1, TIn2, TOut>>(this, CreateTestCase(in1, in2));
        }
    }

    public class GeneralTestRowCollector<TIn1, TIn2, TIn3, TOut> : TestRowCollector<TIn1, TIn2, TIn3, TOut>
    {
        public GeneralTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TOut> testCollection)
            : base(testCollection)
        {
        }

        public GeneralExpector<TIn1, TIn2, TIn3, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TOut>> Given(TIn1 in1, TIn2 in2, TIn3 in3)
        {
            return new GeneralExpector<TIn1, TIn2, TIn3, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TOut>>(this, CreateTestCase(in1, in2, in3));
        }
    }

    public class GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TOut> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, TOut>
    {
        public GeneralTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TOut> testCollection)
            : base(testCollection)
        {
        }

        public GeneralExpector<TIn1, TIn2, TIn3, TIn4, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TOut>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4)
        {
            return new GeneralExpector<TIn1, TIn2, TIn3, TIn4, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TOut>>(this, CreateTestCase(in1, in2, in3, in4));
        }
    }

    public class GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut>
    {
        public GeneralTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> testCollection)
            : base(testCollection)
        {
        }

        public GeneralExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5)
        {
            return new GeneralExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut>>(this, CreateTestCase(in1, in2, in3, in4, in5));
        }
    }

    public class GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut>
    {
        public GeneralTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> testCollection)
            : base(testCollection)
        {
        }

        public GeneralExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5, TIn6 in6)
        {
            return new GeneralExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut, GeneralTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut>>(this, CreateTestCase(in1, in2, in3, in4, in5, in6));
        }
    }

}